package util.archivo;

import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Patricio
 */
public class ArchivoConf extends File{
    private String COMENTARIO = "#";
    
    public ArchivoConf(String nuevoArchivo){
        super(nuevoArchivo);
        if(!this.exists()){
            try {
                this.createNewFile();
            } catch (IOException ex) {
                Logger.getLogger(ArchivoConf.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    
    public synchronized void addCampoDeConfiguracion(String campo, String valor){
        escribirEnArchivo(campo+"="+valor+";");
    }

    public void addComentario(String comentario){
        escribirEnArchivo(COMENTARIO+comentario);
    }

    public synchronized void actualizarCampo(String campo, String valor){
        String[] texto;
        String[] lineasDelArchivo = new String[getCantidadDeLineas()];
        FileInputStream fis = null;
        BufferedReader reader = null;
        int i = 0;

        try {
            fis = new FileInputStream(this.getPath());
            reader = new BufferedReader(new InputStreamReader(fis));
            String linea;
            while ((linea = reader.readLine()) != null) {
                if(!linea.startsWith(COMENTARIO)){
                    texto = linea.split("=");
                    if(texto[0].trim().equalsIgnoreCase(campo)){
                        texto[1] = ";";
                        texto[1] = texto[1].replaceAll(";", valor+";");
                        linea = texto[0]+"="+texto[1];
                    }
                    lineasDelArchivo[i] = linea;
                }else{
                    lineasDelArchivo[i] = linea;
                }
                i++;
            }

            for(i=0;i<lineasDelArchivo.length;i++){
                escribirEnArchivo(lineasDelArchivo[i]);
            }
        } catch (Exception e) {
        } finally {
            try {
                fis.close();
                reader.close();
            } catch (IOException ex) {
            }
        }
    }

    public synchronized void actualizarCampo(String campo, java.awt.Color obj){
        String[] texto;
        String[] lineasDelArchivo = new String[getCantidadDeLineas()];
        FileInputStream fis = null;
        BufferedReader reader = null;
        int i = 0;

        try {
            fis = new FileInputStream(this.getPath());
            reader = new BufferedReader(new InputStreamReader(fis));
            String linea;
            while ((linea = reader.readLine()) != null) {
                if(!linea.startsWith(COMENTARIO)){
                    texto = linea.split("=");
                    if(texto[0].trim().equalsIgnoreCase(campo)){
                        texto[1] = ";";
                        texto[1] = texto[1].replaceAll(";", obj.getRGB()+";");
                        linea = texto[0]+"="+texto[1];
                    }
                    lineasDelArchivo[i] = linea;
                }else{
                    lineasDelArchivo[i] = linea;
                }
                i++;
            }

            for(i=0;i<lineasDelArchivo.length;i++){
                escribirEnArchivo(lineasDelArchivo[i]);
            }
        } catch (Exception e) {
        } finally {
            try {
                fis.close();
                reader.close();
            } catch (IOException ex) {
            }
        }
    }

    public synchronized String getValorDeConfiguracion(String campo){
        String[] texto;
        FileInputStream fis = null;
        BufferedReader reader = null;
        try {
            fis = new FileInputStream(this.getPath());
            reader = new BufferedReader(new InputStreamReader(fis));
            String linea;
            while ((linea = reader.readLine()) != null) {
                if(!linea.startsWith(COMENTARIO)){
                    texto = linea.split("=");
                    if(texto[0].trim().equalsIgnoreCase(campo)){
                        return texto[1].replaceAll(";", "").trim();
                    }
                }
            }
            return null;
        } catch (Exception e) {
            return null;
        } finally {
            try {
                fis.close();
                reader.close();
            } catch (IOException ex) {
                Logger.getLogger(ArchivoConf.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

    }

    public synchronized void setSimboloDeComentario(String simboloAntiguo, String simboloNuevo){
        COMENTARIO = simboloAntiguo;
        cambiarSimboloDeComentarioEnArchivo(simboloNuevo);
        COMENTARIO = simboloNuevo;
    }

    public synchronized void setSimboloDeComentario(String simbolo){
        COMENTARIO = simbolo;
    }

    public synchronized int getCantidadDeCampos(){
        FileInputStream fis = null;
        BufferedReader reader = null;
        int cont = 0;
        try {
            fis = new FileInputStream(this.getPath());
            reader = new BufferedReader(new InputStreamReader(fis));
            String linea;
            while ((linea = reader.readLine()) != null) {
                if(!linea.startsWith(COMENTARIO)){
                    cont++;
                }
            }

            return cont;
        } catch (Exception e) {
            return -1;
        } finally {
            try {
                fis.close();
                reader.close();
            } catch (IOException ex) {
            }
        }
    }

    public synchronized void comentarCampo(String campo){
        String[] texto;
        String[] lineasDelArchivo = new String[getCantidadDeLineas()];
        FileInputStream fis = null;
        BufferedReader reader = null;
        int i = 0;

        try {
            fis = new FileInputStream(this.getPath());
            reader = new BufferedReader(new InputStreamReader(fis));
            String linea;
            while ((linea = reader.readLine()) != null) {
                if(!linea.startsWith(COMENTARIO)){
                    texto = linea.split("=");
                    if(texto[0].trim().equalsIgnoreCase(campo)){
                        lineasDelArchivo[i] = COMENTARIO+linea;
                    }else{
                        lineasDelArchivo[i] = linea;
                    }
                }else{
                    lineasDelArchivo[i] = linea;
                }
                i++;
            }

            
            for(i=0;i<lineasDelArchivo.length;i++){
                escribirEnArchivo(lineasDelArchivo[i]);
            }
        } catch (Exception e) {
        } finally {
            try {
                fis.close();
                reader.close();
            } catch (IOException ex) {
            }
        }
    }

    public synchronized void descomentarCampo(String campo){
        String[] texto;
        String[] lineasDelArchivo = new String[getCantidadDeLineas()];
        FileInputStream fis = null;
        BufferedReader reader = null;
        int i = 0;

        try {
            fis = new FileInputStream(this.getPath());
            reader = new BufferedReader(new InputStreamReader(fis));
            String linea;
            while ((linea = reader.readLine()) != null) {
                if(linea.startsWith(COMENTARIO)){
                    texto = linea.split("=");
                    texto[0] = texto[0].trim().substring(1);
                    if(texto[0].trim().equalsIgnoreCase(campo)){
                        lineasDelArchivo[i] = linea.substring(1);
                    }else{
                        lineasDelArchivo[i] = linea;
                    }
                }else{
                    lineasDelArchivo[i] = linea;
                }
                i++;
            }

            for(i=0;i<lineasDelArchivo.length;i++){
                escribirEnArchivo(lineasDelArchivo[i]);
            }
        } catch (Exception e) {
        } finally {
            try {
                fis.close();
                reader.close();
            } catch (IOException ex) {
            }
        }
    }

    public String getNombreDeArchivo(){
        return this.getName();
    }
    
    public String getRutaArchivo(){
        return this.getPath();
    }

    private void escribirEnArchivo(String linea) {
        try {
            PrintWriter archivoWriter = new PrintWriter(new FileWriter(this, true));
            archivoWriter.println(linea);
            if (archivoWriter != null) {
                archivoWriter.close();
            }
        } catch (IOException ex) {
            Logger.getLogger(ArchivoConf.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private synchronized void cambiarSimboloDeComentarioEnArchivo(String simboloNuevo) {
        String[] lineasDelArchivo = new String[getCantidadDeLineas()];
        FileInputStream fis = null;
        BufferedReader reader = null;
        int i = 0;

        try {
            fis = new FileInputStream(this.getPath());
            reader = new BufferedReader(new InputStreamReader(fis));
            String linea;
            while ((linea = reader.readLine()) != null) {
                if(linea.startsWith(COMENTARIO)){
                    linea = linea.replaceFirst(COMENTARIO, simboloNuevo);
                    lineasDelArchivo[i] = linea;
                }else{
                    lineasDelArchivo[i] = linea;
                }
                i++;
            }

            for(i=0;i<lineasDelArchivo.length;i++){
                escribirEnArchivo(lineasDelArchivo[i]);
            }
        } catch (Exception e) {
        } finally {
            try {
                fis.close();
                reader.close();
            } catch (IOException ex) {
            }
        }
    }

    private int getCantidadDeLineas() {
        FileInputStream fis = null;
        BufferedReader reader = null;
        int cont = 0;
        try {
            fis = new FileInputStream(this.getPath());
            reader = new BufferedReader(new InputStreamReader(fis));
            String linea;
            while ((linea = reader.readLine()) != null) {
                cont++;
            }

            return cont;
        } catch (Exception e) {
            return -1;
        } finally {
            try {
                fis.close();
                reader.close();
            } catch (IOException ex) {
            }
        }
    }
}
